package com.match.utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.match.model.DiscussModel;

public class POIUtils {

    /**
     * 适用于第一行是标题行的excel，例如 姓名 年龄 性别 身高 张三 25 男 175 李四 22 女 160
     * 每一行构成一个map，key值是列标题，value是列值。没有值的单元格其value值为null
     * 返回结果最外层的list对应一个excel文件，第二层的list对应一个sheet页，第三层的map对应sheet页中的一行
     * @throws Exception
     */
    public static List<DiscussModel> readExcelWithTitle(String filepath, boolean isTitle)
            throws Exception {
        String fileType = filepath.substring(filepath.lastIndexOf(".") + 1, filepath.length());
        InputStream is = null;
        Workbook wb = null;
        try {
            is = new FileInputStream(filepath);

            if (fileType.equals("xls") || fileType.equals("csv")) {
                wb = new HSSFWorkbook(is);
            } else if (fileType.equals("xlsx")) {
                wb = new XSSFWorkbook(is);
            } else {
                throw new Exception("读取的不是excel文件");
            }

            List<DiscussModel> result = new ArrayList<>();// 对应excel文件

            int sheetSize = wb.getNumberOfSheets();
            for (int i = 0; i < sheetSize; i++) {// 遍历sheet页
                Sheet sheet = wb.getSheetAt(i);
                // Map<String, DiscussModel> sheetList = new HashMap<>();//
                // 对应sheet页

                // List<String> titles = new ArrayList<String>();// 放置所有的标题

                int rowSize = sheet.getLastRowNum() + 1;
                for (int j = 0; j < rowSize; j++) {// 遍历行
                    Row row = sheet.getRow(j);
                    if (row == null) {// 略过空行
                        continue;
                    }
                    int cellSize = row.getLastCellNum();// 行中有多少个单元格，也就是有多少列
                    if (isTitle) {// 第一行是标题行
                        // for (int k = 0; k < cellSize; k++) {
                        // Cell cell = row.getCell(k);
                        // titles.add(cell.toString());
                        // }
                        isTitle = false;
                        continue;// 如果是第一行则跳过
                    } else {// 其他行是数据行
                        // Map<String, DiscussModel> rowMap = new
                        // HashMap<String, DiscussModel>();// 对应一个数据行
                        DiscussModel discuss = new DiscussModel();
                        // for (int k = 0; k < titles.size(); k++) {
                        // Cell cell = row.getCell(k);
                        // String key = titles.get(k);
                        // String value = null;
                        // if (cell != null) {
                        // value = cell.toString();
                        // }
                        // 将每一行的数据放入对象中
                        if (null == row.getCell(0) || null == row.getCell(1)) {
                            continue;
                        }
                        discuss.setId(row.getCell(0).getStringCellValue());
//                        System.out.println(row.getCell(0));
//                        System.out.println(row.getCell(1));
                        row.getCell(1).setCellType(Cell.CELL_TYPE_STRING);
                        discuss.setDiscuss(row.getCell(1).getStringCellValue());
                        if (cellSize >= 2) {
                            if (null != row.getCell(2)) {
                                discuss.setScore(row.getCell(2).getNumericCellValue() + "");
                            }
                        }
                        // rowMap.put(discuss.getId(), discuss);
                        // result.add(rowMap); // 将每一行的数据放入result中
                        result.add(discuss);
                        // }
                        // sheetList.add(rowMap);

                    }

                }

            }

            return result;
        } catch (

        FileNotFoundException e) {
            throw e;
        } finally {
            // if (wb != null) {
            // wb.close();
            // }
            if (is != null) {
                is.close();
            }
        }
    }

    /**
     * excel导出到输出流 谁调用谁负责关闭输出流
     * @param os 输出流
     * @param excelExtName excel文件的扩展名，支持xls和xlsx，不带点号
     * @param data
     * @throws IOException
     */
    public static void writeExcel(FileOutputStream os,
            Map<String, Set<String>> data) throws IOException {
        Workbook wb = new HSSFWorkbook();
//        String fileType = excelExtName.substring(excelExtName.lastIndexOf(".") + 1, excelExtName.length());
        
        try {
//            if ("xls".equals(fileType)) {
//                wb = new HSSFWorkbook();
//            } else if ("xlsx".equals(fileType)) {
//                wb = new XSSFWorkbook();
//            } else {
//                throw new Exception("当前文件不是excel文件");
//            }
            Sheet sheet = wb.createSheet("训练关键字");
            for (int i = 0; i < 5; i++) {
                Set<String> type1 = data.get("type1");
                Set<String> type2 = data.get("type2");
                Set<String> type3 = data.get("type3");
                Set<String> type4 = data.get("type4");
                Set<String> type5 = data.get("type5");
                Row row = sheet.createRow(i);
                if (0 == i) {
                    Cell cellkey = row.createCell(0);
                    cellkey.setCellValue("type1");
                    Cell cellValue = row.createCell(1);
                    cellValue.setCellValue(type1.toString());
                } else if (1 == i) {
                    Cell cellkey = row.createCell(0);
                    cellkey.setCellValue("type2");
                    Cell cellValue = row.createCell(1);
                    cellValue.setCellValue(type2.toString());
                } else if (2 == i) {
                    Cell cellkey = row.createCell(0);
                    cellkey.setCellValue("type3");
                    Cell cellValue = row.createCell(1);
                    cellValue.setCellValue(type3.toString());
                } else if (3 == i) {
                    Cell cellkey = row.createCell(0);
                    cellkey.setCellValue("type4");
                    Cell cellValue = row.createCell(1);
                    cellValue.setCellValue(type4.toString());
                } else if (4 == i) {
                    Cell cellkey = row.createCell(0);
                    cellkey.setCellValue("type5");
                    Cell cellValue = row.createCell(1);
                    cellValue.setCellValue(type5.toString());
                }

            }
            wb.write(os);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // if (wb != null) {
            // wb.close();
            // }
        }
    }
}
